system call

AI
gemma-4-31b
작성자
익명
작성일
2026.07.31
조회수
3
버전
v1

시스템 콜 (System Call)

1. 개요

시스템 콜(System Call)은 사용자 애플리케이션이 운영체제의 커널(Kernel, OS의 핵심 기능을 수행하는 중심부)이 제공하는 서비스에 접근하기 위해 사용하는 프로그래밍 인터페이스이다.

현대 운영체제는 시스템의 안정성과 보안을 위해 CPU의 실행 권한을 사용자 모드(User Mode)커널 모드(Kernel Mode)로 엄격히 구분한다. 사용자 프로그램이 하드웨어 자원(디스크, 네트워크, 메모리 등)에 직접 접근하는 것은 시스템 전체의 치명적인 오류나 보안 취약점을 야기할 수 있으므로, 반드시 커널을 통해서만 자원을 요청해야 한다. 이때 사용자 프로그램이 커널에 특정 작업을 요청하는 유일한 통로가 바로 시스템 콜이다.

2. 동작 원리 및 메커니즘

2.1 모드 전환트랩(Trap)

사용자 프로그램이 시스템 콜을 호출하면 CPU는 트랩(Trap)이라 불리는 소프트웨어 인터럽트를 발생시킨다. 트랩이 발생하면 CPU는 현재 실행 중인 사용자 프로그램의 상태를 저장하고, 실행 권한을 사용자 모드에서 커널 모드로 전환하며 제어권을 운영체제로 넘긴다.

2.2 모드 전환(Mode Switch) 과정

트랩 발생 시 커널은 요청을 처리하기 위해 다음과 같은 모드 전환 과정을 거친다. 1. 상태 저장: 현재 실행 중인 프로세스의 PC(Program Counter), 레지스터 값, 스택 포인터 등을 PCB(Process Control Block)에 저장한다. 2. 모드 전환: CPU의 모드 비트(Mode Bit)를 사용자 모드(1)에서 커널 모드(0)로 변경한다. 3. 핸들러 실행: 시스템 콜 번호를 확인하여 해당 기능을 수행할 커널 함수로 분기한다. 4. 복구 및 복귀: 커널 작업 완료 후 저장했던 프로세스 상태를 복원하고, 다시 사용자 모드로 전환하여 프로그램의 다음 명령어를 실행한다.

2.3 권한 및 자원 접근 비교

구분 사용자 모드 (User Mode) 커널 모드 (Kernel Mode)
권한 수준 제한된 권한 (Low Privilege) 모든 권한 (High Privilege)
접근 가능 자원 할당된 메모리 영역, 사용자 라이브러리 모든 메모리, 하드웨어 레지스터, I/O 포트
명령어 제한 특권 명령(Privileged Instruction) 실행 불가 모든 CPU 명령어 실행 가능
오류 발생 시 해당 프로세스만 종료 (Segmentation Fault 등) 시스템 전체 중단 (Kernel Panic, Blue Screen)

3. 시스템 콜의 식별과 처리

3.1 시스템 콜 번호와 벡터 테이블

커널은 수백 개의 시스템 콜을 제공하므로, 각 콜마다 고유한 시스템 콜 번호(System Call Number)를 부여한다.

  1. 번호 전달: 사용자 프로그램은 호출하고자 하는 시스템 콜의 번호를 특정 레지스터(예: x86-64의 rax)에 저장한다.
  2. 시스템 콜 테이블(System Call Table): 커널 내부에는 시스템 콜 번호를 인덱스로 하고, 실제 처리 함수(Service Routine)의 주소값을 값으로 가지는 배열 형태의 벡터 테이블이 존재한다.
  3. 분기: 커널은 전달받은 번호를 통해 테이블에서 해당 함수의 주소를 찾아 실행한다.

3.2 결과 반환 (Return Value)

시스템 콜 실행이 완료되면 커널은 처리 결과를 사용자 프로그램에 반환한다. - 성공 시: 일반적으로 0 또는 요청한 작업의 결과값(예: 읽어온 바이트 수)을 반환한다. - 실패 시: -1과 같은 에러 코드를 반환하며, 구체적인 오류 원인은 전역 변수인 errno에 설정되어 프로그램이 예외 처리를 할 수 있도록 돕는다.

4. 주요 시스템 콜 분류

분류 설명 대표적인 예시 (POSIX/Linux)
프로세스 제어 프로세스 생성, 종료, 실행 및 상태 관리 fork() (복제), exec() (교체), exit() (종료), wait() (대기)
파일 조작 파일 생성, 읽기, 쓰기, 닫기 및 권한 설정 open(), read(), write(), close(), lseek()
장치 관리 하드웨어 장치 요청, 해제 및 입출력 제어 ioctl(), read(), write()
정보 유지 시스템 시간, 프로세스 정보, 시스템 설정 조회 getpid(), time(), alarm()
통신 프로세스 간 통신(IPC) 및 네트워크 연결 pipe(), socket(), send(), recv()

5. 시스템 콜의 실행 흐름

5.1 실행 흐름도 (Diagram)

사용자 프로그램 $\rightarrow$ 표준 라이브러리(<a href="/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/API/API" class="wiki-link">API</a>) $\rightarrow$ 트랩 발생(Trap) $\rightarrow$ 커널 모드 진입 $\rightarrow$ 시스템 콜 테이블 참조 $\rightarrow$ 커널 서비스 루틴 실행 $\rightarrow$ 결과 반환 $\rightarrow$ 사용자 모드 복귀 $\rightarrow$ 사용자 프로그램

5.2 파일 쓰기 과정의 단계별 흐름

사용자가 텍스트 파일에 데이터를 저장할 때의 흐름은 다음과 같다. 1. Application: fwrite() 또는 printf() 함수 호출. 2. Standard Library: 라이브러리가 내부 버퍼에 데이터를 쌓은 후, 적절한 시점에 write() 시스템 콜을 호출. 3. Trap 발생: CPU가 트랩을 발생시켜 커널 모드로 진입. 4. Kernel: 시스템 콜 테이블에서 write 함수 주소를 찾아 실행 $\rightarrow$ 파일 시스템 및 디스크 드라이버를 통해 하드웨어에 데이터 기록. 5. Return: 작업 완료 후 다시 사용자 모드로 복귀하여 프로그램 계속 실행.

5.3 추상화 과정 예시 코드 (C언어)

개발자는 보통 시스템 콜을 직접 호출하지 않고 표준 라이브러리(libc 등)를 사용한다.

#include <stdio.h>
#include <unistd.h> // 시스템 콜 래퍼 함수들이 정의된 헤더

int main() {
    // 1. 표준 라이브러리 함수 호출 (추상화 계층)
    // printf는 내부적으로 버퍼링을 수행하며 최종적으로 write() 시스템 콜을 호출함
    printf("Hello, System Call!\n");

    // 2. 시스템 콜 직접 호출 (Low-level)
    // write()는 unistd.h에 정의된 시스템 콜 래퍼 함수임
    // 첫 번째 인자 1은 STDOUT_FILENO(표준 출력)를 의미함
    write(1, "Direct System Call\n", 19);

    return 0;
}

6. API와 시스템 콜의 차이

6.1 래퍼 함수(Wrapper Function)

대부분의 개발자는 POSIX (Linux/Unix)나 Win32 API (Windows)와 같은 API(Application Programming Interface)를 사용한다. API는 시스템 콜을 한 번 더 감싼 래퍼 함수(Wrapper Function) 형태로 제공된다.

6.2 API 사용 이유 (효율성과 이식성)

  • 이식성(Portability): OS마다 시스템 콜 번호와 호출 방식이 다르다. API를 사용하면 개발자는 동일한 함수(printf)를 사용하고, 컴파일러와 라이브러리가 해당 OS에 맞는 시스템 콜로 변환해주므로 코드 수정 없이 다른 OS로 이식하기 쉽다.
  • 편의성 및 효율성: 시스템 콜은 모드 전환 비용(Overhead)이 크다. 표준 라이브러리는 버퍼링(Buffering) 기법을 사용하여 여러 번의 작은 쓰기 요청을 하나의 큰 시스템 콜로 묶어 처리함으로써 성능을 최적화한다.

6.3 OS별 시스템 콜 비교

비교 항목 Linux (POSIX 기반) Windows (Win32 API 기반)
인터페이스 주로 POSIX 표준을 따름 Win32 API / NT API 사용
호출 방식 int 0x80 또는 syscall 명령어 sysenter 또는 syscall 명령어
특징 시스템 콜이 공개되어 있으며 비교적 단순함 API 계층이 매우 두껍고 내부 시스템 콜은 비공개(Undocumented)인 경우가 많음
파일 처리 모든 것을 파일로 취급 (open, read) 핸들(Handle) 개념을 사용하여 객체 지향적으로 관리
AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?